package com.xxy.lineartable;

/**
 * @author xxy
 * @create 2020 10 07 19:23
 * 实现对线性表的常规操作：增删改查
 */
public class SqList implements MyList {
    //创建一个存储空间为maxSize的顺序表
    private Object[] myList;//顺序表的存储空间
    private int size;//顺序表的当前长度
    private int maxSize;//最大的存储长度
    //顺序表的数据结构
    public SqList(int maxsize) {
        this.size=0;
        this.maxSize=maxsize;
        this.myList=new Object[maxSize];
    }
    @Override
    /**
     * 获取线性表的大小
     */
    public int getSize() {
        return this.size;
    }

    @Override
    /**
     * 判断是否为空表
     */
    public boolean isEmpty() {
        return size==0;
    }
    @Override
    /**
     * 判断是否包含有元素e
     */
    public boolean contains(Object e) {
        for (int i=0;i<myList.length;i++){
            if(myList[i]==e){
                return true;
            }
        }
        return false;
    }

    @Override
    /**
     * 查找元素e的索引
     */
    public int indexOf(Object e) {
        for (int i=0;i<myList.length;i++){
            if (myList[i]==e){
                return i;
            }
        }
        return -1;
    }
    @Override
    /**
     * 返回在i处的元素
     */
    public Object get(int i) {
        if(i<0||i>=myList.length){
            return -1;
        }else {
            return myList[i];
        }
    }
    @Override
    /**
     * 向链表中增加元素
     */
    public void add(int i, Object e) throws Exception {
        if(size==maxSize)
            throw new Exception("顺序表已满，不可插入");
        if(i<0||i>size)
            throw new Exception("插入位置不合法");
        for(int j=size;j>i;j--){
            myList[j]=myList[j-1];
        }
        myList[i]=e;
        size++;
    }
    @Override
    /**
     * 将元素加在末尾
     */
    public void add(Object e) throws Exception {
        this.add(size,e);
    }

    @Override
    /**
     * obj前插入e
     */
    public boolean addBefore(Object obj, Object e) throws Exception {
        int i=indexOf(obj);
        if(i<0)
            return false;
        this.add(i,e);
        return true;
    }
    @Override
    /**
     * obj后插入e
     */
    public boolean addAfter(Object obj, Object e) throws Exception {
        int i=indexOf(obj);
        if(i<0)
            return false;
        this.add(i+1,e);
        return true;
    }
    @Override
    public void remove(int i) throws Exception {
        if(i<0||i>size-1)  //判断是否越界
            throw new Exception("删除位置不合法");
        for (int j =i ;j<size-1;j++){
            myList[j]=myList[j+1];
        }
        size--;
    }
    @Override
    /**
     * 移除最后一个元素
     */
    public boolean removed(Object e) throws Exception {
        int i=indexOf(e);
        if(i<0)
            return false;
        remove(i);
            return true;
    }
    @Override
    /**
     * 替换i位置为e
     */
    public Object replace(int i, Object e) throws Exception {
        if(i<0||i>size)
            throw new Exception("位置不合法");
        Object object = myList[i];
        myList[i]=e;
        return object;
    }
    @Override
    /**
     * 遍历链表
     */
    public void display() {
        for (int i = 0;i<size;i++){
            System.out.print(myList[i]+" ");
        }
    }

    /**
     * 小测试
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        SqList sqList = new SqList(10);
        for (int i = 0;i<10;i++){
            sqList.add(i,i);
        }
        sqList.display();//遍历
        sqList.indexOf(3);//查找
        System.out.println(sqList.isEmpty());//判断是否为空
        sqList.remove(9);//删除下标为9
        sqList.display();
        System.out.println( sqList.getSize());//输出链表的长度
        System.out.println(sqList.contains(3));
    }
}
